package cn.itsource.pethome.basic.service.impl;

import cn.itsource.pethome.basic.constant.PetHomeConstant;
import cn.itsource.pethome.basic.service.IVerificationCodeService;
import cn.itsource.pethome.basic.util.SendMsgUtil;
import cn.itsource.pethome.basic.util.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class VerificationCodeServiceImpl implements IVerificationCodeService {
    @Autowired
    private RedisTemplate redisTemplate;

    /*
     * 生成的验证码特点：
     * 1.四位随机数
     * 2.判断你重复发送时间是否一分钟内
     * 3.有效期五分钟
     * 4.区分验证码类型
     * 常见注册验证码要求
     * 1.判断你是否为注册验证码（通过设置常量解决
     * 2.判断你是否在一分钟内发送 如果在 提示不能频繁发送
     * 3.判断是否在大于一分钟小于五分钟内访问，则给之前生成的重复的验证码
     * 4.大于五分钟则重新生成验证码
     * */

    @Override
    public void sendRegisterMobileCode(String phone) {
        //发送手机验证码
        sendMobileCode(phone,PetHomeConstant.REGISTER_VERIFICATION_CODE);
    }

    @Override
    public void sendBinderMobileCode(String phone) {
        //发送绑定验证码
        sendMobileCode(phone,PetHomeConstant.BINDER_VERIFICATION_CODE);
    }

    private void sendMobileCode(String phone,String type){
        //1.产生随机4位的验证码  JK82
        String code = StrUtils.getComplexRandomString(4);
        //通过手机号码在redis中获取对应的验证码    JK82:21312433542423
        String codeValue = (String) redisTemplate.opsForValue().get(type+":"+phone);
        if(!StringUtils.isEmpty(codeValue)){
            //获取第一次的毫秒时间
            Long beginTimer = Long.valueOf(codeValue.split(":")[1]);
            if(System.currentTimeMillis()-beginTimer<60*1000){
                throw new RuntimeException("一分钟以内不能重复获取验证码!!!");
            }
            //如果没有走抛异常就证明验证码依然在5分钟以内，但是超过了1分钟
            code = codeValue.split(":")[0];
        }
        //2.把验证码存储到redis中，并且有效期是5分钟
        redisTemplate.opsForValue().set(type+":"+phone,
                code+":"+System.currentTimeMillis(),5, TimeUnit.MINUTES);
        String content = "尊敬的用户，你的验证码为:"+code+",请在5分钟以内完成验证操作!!";
        System.out.println(content);
    }

}
